Amazon S3 バケット内のオブジェクトを削除する際に、バケット直下のオブジェクトのみ削除する方法

Amazon S3 バケット内のオブジェクトを削除する際に、バケット直下のオブジェクトのみ削除する方法

--exclude や --include オプションを駆使することで、対象を絞り込みましょう。
Clock Icon2024.08.13

困っていること

S3 バケット内のオブジェクトについて、バケット直下のオブジェクトのみを削除したいです。
フォルダ構造が下記のようになっています。

$ aws s3 ls s3://test-bucket-blog --recursive
2024-08-01 03:22:54 0 test-aaaa.zip
2024-08-01 03:22:54 0 test-bbbb.zip
2024-08-01 03:22:10 0 test-cccc/
2024-08-01 03:23:42 0 test-cccc/data.zip
2024-08-01 03:23:24 0 test-cccc/test-dddd.zip

test で始まるオブジェクトを削除するため、下記のコマンドを実行しましたが、フォルダも削除対象になってしまいます。

$ aws s3 rm s3://test-bucket-blog --exclude "*" --include "test*" --recursive --dryrun
(dryrun) delete: s3://test-bucket-blog/test-aaaa.zip
(dryrun) delete: s3://test-bucket-blog/test-bbbb.zip
(dryrun) delete: s3://test-bucket-blog/test-cccc/
(dryrun) delete: s3://test-bucket-blog/test-cccc/data.zip
(dryrun) delete: s3://test-bucket-blog/test-cccc/test-dddd.zip

どのように回避したらいいでしょうか?

どう解決すればいいの?

Amazon S3 はあくまでキーバリューストアであり、フォルダの概念はありませんが、グループ化の方法としてフォルダの概念をサポートしています。
そのため、--include "test*" というオプションを付与すると、test* で始まるオブジェクト、すなわち、フォルダに見える test* で始まるオブジェクトも対象となります。

--exclude "*/*" をさらに指定することで、共通プレフィックスとして使われる"/"の文字列が含まれるオブジェクトを対象から外すことができます。
下記のコマンドを実施してください。

$ aws s3 rm s3://test-20240528 --exclude "*" --include "test*" --exclude "*/*" --recursive --dryrun
(dryrun) delete: s3://test-bucket-blog/test-aaaa.zip
(dryrun) delete: s3://test-bucket-blog/test-bbbb.zip

参考資料

フォルダを使用して Amazon S3 コンソールのオブジェクトを整理する - Amazon Simple Storage Service

AWS CLI で高レベル (s3) コマンドを使用する - AWS Command Line Interface

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.